﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TaskLockApp
{
    /*
    多线程中的"锁"，多线程任务执行的时候，我们可以认为这些线程是并列执行的。如果多个线程，同一个访问一个"资源"，如果没有执行完，其他线程进来同时使用这个资源，就会造成资源的"争夺"，程序就会出现问题。可能就得不到你要的结果
    所以，使用线程锁，在一个线程使用一个资源的时候，其他线程必须等待。也就是排队
     */
    class TestLock
    {
        private int nums = 0;

        //private object myLock = new object(); //其实这个也可以不用定义

        public void TestCount()
        {
            /*lock(myLock)
            {
                for (int i = 0; i < 100; i++)
                {
                    nums++;
                    Console.WriteLine(nums);
                }
            }     */
            lock (this) //推荐使用
            {
                for (int i = 0; i < 100; i++)
                {
                    nums++;
                    Console.WriteLine(nums);
                }
            }
        }

        public void Start()
        {
            for (int i = 0; i < 5; i++)
            {
                Task.Run(() =>
                {
                    TestCount();
                });
            }      
        }
    }
}
